import os
import tensorflow as tf

# f(x,y) = 3x*x + 4y*y + 5 x * y + 6
# x = 2, y = 3
if __name__ == '__main__':
    os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

    x = tf.Variable(initial_value=2, dtype=tf.float32)
    y = tf.Variable(initial_value=3, dtype=tf.float32)

    with tf.GradientTape() as tape:
        f = 3 * tf.square(x) + 4 * tf.square(y) + 5 * x * y + 6

    # 分开写的时候，不可以既对 x 又对 y 进行求解
    # tape.gradient 只能调用一次
    # 对 x 求偏导
    # f_grad_x = tape.gradient(f, x)
    # 对 y 求偏导
    # f_grad_y = tape.gradient(f, y)

    # 同时对 x 和 y 求偏导必须 放到列表中一次完成。
    f_grad_x, f_grad_y = tape.gradient(f, [x, y])

    print(f)
    print(f_grad_x)
    print(f_grad_y)
